/*
 * Copyright (C) 2019-2020 Alibaba Group Holding Limited
 */

#ifndef __LSCREEN_H__
#define __LSCREEN_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <devices/device.h>
#include "drv_display.h"

typedef struct _led_screen_t led_screen_t;

typedef struct {
    aos_dev_t *dev_disp;            // 点阵屏硬件设备句柄
    int hor_resolution;             // 宽
    int ver_resolution;             // 高
    const char *ascii_map_name;     // 点阵屏字库名称，如"5x3"
} lscreen_config_t;

/**
 * 点阵屏初始化
 * @param config 点阵屏配置参数
 * @return NULL：失败，others: 点阵屏句柄
 */
led_screen_t *lscreen_init(lscreen_config_t *config);

/**
 * 点阵屏反初始化
 * @param hdl 点阵屏句柄
 * @return 0：成功，-1: 失败
 */
int lscreen_deinit(led_screen_t *hdl);

/**
 * 点阵屏使能显示
 * @param hdl 点阵屏句柄
 * @param en 1: 使能，0: 关闭
 * @return 0：成功，-1: 失败
 */
int lscreen_enable(led_screen_t *hdl, int en);

/**
 * 点阵屏刷屏显示
 * @param hdl 点阵屏句柄
 * @return 0：成功，-1: 失败
 */
int lscreen_flush(led_screen_t *hdl);

/**
 * 点阵屏刷屏显示字符
 * @param hdl 点阵屏句柄
 * @param start_col 起始横坐标
 * @param start_row 起始纵坐标
 * @param c 显示字符
 * @param brt 字符像素点的值（亮度）
 * @return 0：成功，-1: 失败
 */
int lscreen_show_ascii(led_screen_t *hdl, int start_col, int start_row, char c, int brt);

/**
 * 更新屏幕内容为字符串
 * @param hdl 点阵屏句柄
 * @param start_col 起始横坐标
 * @param start_row 起始纵坐标
 * @param str 字符串
 * @param on_val 字符像素点的值（亮度）
 * @return 0：成功，-1: 失败
 */
int lscreen_show_string(led_screen_t *hdl, int start_col, int start_row, const char *str, int on_val);

/**
 * 更新点阵
 * @param hdl 点阵屏句柄
 * @param start_col 起始横坐标
 * @param start_row 起始纵坐标
 * @param buf 待更新的点阵数组
 * @param width 更新区域宽度
 * @param height 更新区域高度
 * @return 0：成功，-1: 失败
 */
int lscreen_show(led_screen_t *hdl, int start_col, int start_row, uint8_t *buf, int width, int height);

/**
 * 播放gif动画
 * @param hdl 点阵屏句柄
 * @param url gif资源url，当前支持文件形式：file:///lfs/res/smile.gif，内存形式：mem://addr=765432&size=1024
 * @return 0：成功，-1: 失败
 */
int lscreen_play_gif(led_screen_t *hdl, const char *url);

/**
 * 清除点阵内容
 * @param hdl 点阵屏句柄
 * @return 0：成功，-1: 失败
 */
int lscreen_clear(led_screen_t *hdl);

/**
 * 打开语音律动功能
 * @param hdl 点阵屏句柄
 * @param update_interval 屏幕刷新频率
 * @return 0：成功，-1: 失败
 */
int lscreen_rhythm_start(led_screen_t *hdl, int update_interval);

/**
 * 关闭语音律动功能
 * @param hdl 点阵屏句柄
 * @return 0：成功，-1: 失败
 */
int lscreen_rhythm_stop(led_screen_t *hdl);

/**
 * 暂停律动
 * @param hdl 点阵屏句柄
 * @return 0：成功，-1: 失败
 */
void lscreen_rhythm_pause(led_screen_t *hdl);

/**
 * 继续律动
 * @param hdl 点阵屏句柄
 * @return 0：成功，-1: 失败
 */
void lscreen_rhythm_resume(led_screen_t *hdl);

/**
 * 更新律动语音数据
 * @param hdl 点阵屏句柄
 * @param data 语音数据
 * @param len 语音数据长度
 * @param cur_vol 当前音量，范围0~100
 * @return 0：成功，-1: 失败
 */
int lscreen_rhythm_data_update(led_screen_t *hdl, int16_t *data, size_t len, int cur_vol);


#ifdef __cplusplus
}
#endif

#endif
